import type { AxiosError, InternalAxiosRequestConfig } from 'axios'
import axios from 'axios'
import { showFailToast } from 'vant'
import { useUserStore } from '@/stores'

// 登录页面路由路径
export const loginRoutePath = '/login'

// 这里是用于设定请求后端时，所用的 Token KEY
// 可以根据自己的需要修改，常见的如 Access-Token，Authorization
// 需要注意的是，请尽量保证使用中横线`-` 来作为分隔符，
// 避免被 nginx 等负载均衡器丢弃了自定义的请求头
export const REQUEST_TOKEN_KEY = 'x-access-token'

// 创建 axios 实例
// 自动添加/api前缀
const request = axios.create({
  // API 请求的默认前缀
  baseURL: import.meta.env.VITE_APP_API_BASE_PREFIX,
  timeout: 10000 // 请求超时时间
})

// export { request, baseURL }

export type RequestError = AxiosError<{
  message?: string
  data?: any
  errorMessage?: string
}>

export type RequestResponseBody<T> = {
  timestamp: string
  message: string
  data: T
}

// 异常拦截处理器
function errorHandler(error: RequestError): Promise<any> {
  // 处理超时错误
  if (error.code === 'ECONNABORTED' && error.message.includes('timeout')) {
    showFailToast({
      message: '请求超时，请稍后重试'
    })
    return Promise.reject(new Error('请求超时'))
  }

  // 处理网络错误
  if (error.message === 'Network Error') {
    showFailToast({
      message: '请检查您的网络连接'
    })
    return Promise.reject(new Error('网络连接失败'))
  }
  if (error.response) {
    const { data = {}, status, statusText } = error.response
    console.log('status', status)
    // 403 无权限
    if (status === 403) {
      showFailToast({
        message: (data && data.message) || statusText
      })
    }
    // 401 未登录/未授权
    if (status === 401) {
      showFailToast({
        message: 'Authorization verification failed'
      })
      // 如果你需要直接跳转登录页面
      location.replace(loginRoutePath)
    }
    // 500 服务器错误
    if (status === 500) {
      showFailToast({
        message: data.message
      })
    }
  }
  return Promise.reject(error)
}

// 请求拦截器
function requestHandler(
  config: InternalAxiosRequestConfig
): InternalAxiosRequestConfig | Promise<InternalAxiosRequestConfig> {
  const token = useUserStore().user?.token
  // 如果 token 存在
  // 让每个请求携带自定义 token, 请根据实际情况修改
  if (token) config.headers[REQUEST_TOKEN_KEY] = token

  return config
}

// Add a request interceptor
request.interceptors.request.use(requestHandler, errorHandler)

// 响应拦截器
function responseHandler(response: { data: any }) {
  // 确保返回的数据结构符合预期
  return response.data
}

// Add a response interceptor
request.interceptors.response.use(responseHandler, errorHandler)

export { request }
